package fr.ajicommerce.core.entities;

import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "COMPTE_CLIENT")
@NamedQueries({

		/**
		 * Récupération d'un CompteClient selon son LOGIN
		 */
		@NamedQuery(name = "CompteClient.findByLogin", query = "select c from CompteClient c where c.login = :login"),

		/**
		 * Récupération d'un CompteClient selon son LOGIN et PASSWORD
		 */
		@NamedQuery(name = "CompteClient.findByLoginAndPassword", query = "select c from CompteClient c where c.login = :login and c.password = :password"), })
public class CompteClient {

	// requêtes
	public static final String FIND_BY_ID = "CompteClient.findById";
	public static final String FIND_BY_LOGIN = "CompteClient.findByLogin";
	public static final String FIND_BY_LOGIN_AND_PASSWORD = "CompteClient.findByLoginAndPassword";

	public CompteClient() {
		super();
	}

	// propriétés

	@Id
	@GeneratedValue
	@Column(nullable = false)
	private Long idCompteClient;

	@Column(unique = true)
	private String login;
	
	private String password;
	private String prenom;
	private String nom;
	private String email;
	private String telephone;
	private Date dateOuverture;
	private Date dateFermeture;
	private boolean isClos;

	@Enumerated(EnumType.STRING)
	private StatusUtilisateur statusUtilisateur;

	@Enumerated(EnumType.STRING)
	private Civilite civilite;

	@Enumerated(EnumType.STRING)
	private Langue langue;

	@OneToMany(cascade = CascadeType.ALL)
	private List<Commande> commandes;

	@OneToMany
	private List<Adresse> adresses;

	@Override
	public String toString() {
		return "CompteClient [idCompteClient=" + idCompteClient + ", login="
				+ login + ", password=" + password + ", prenom=" + prenom
				+ ", nom=" + nom + ", email=" + email + ", telephone="
				+ telephone + ", dateOuverture=" + dateOuverture
				+ ", dateFermeture=" + dateFermeture + ", isClos=" + isClos
				+ ", statusUtilisateur=" + statusUtilisateur + ", civilite="
				+ civilite + ", langue=" + langue + ", commandes=" + commandes
				+ ", adresses=" + adresses + "]";
	}

	public Long getIdCompteClient() {
		return idCompteClient;
	}

	public void setIdCompteClient(Long idCompteClient) {
		this.idCompteClient = idCompteClient;
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getPrenom() {
		return prenom;
	}

	public void setPrenom(String prenom) {
		this.prenom = prenom;
	}

	public String getNom() {
		return nom;
	}

	public void setNom(String nom) {
		this.nom = nom;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getTelephone() {
		return telephone;
	}

	public void setTelephone(String telephone) {
		this.telephone = telephone;
	}

	public Date getDateOuverture() {
		return dateOuverture;
	}

	public void setDateOuverture(Date dateOuverture) {
		this.dateOuverture = dateOuverture;
	}

	public Date getDateFermeture() {
		return dateFermeture;
	}

	public void setDateFermeture(Date dateFermeture) {
		this.dateFermeture = dateFermeture;
	}

	public boolean isClos() {
		return isClos;
	}

	public void setClos(boolean isClos) {
		this.isClos = isClos;
	}

	public StatusUtilisateur getStatusUtilisateur() {
		return statusUtilisateur;
	}

	public void setStatusUtilisateur(StatusUtilisateur statusUtilisateur) {
		this.statusUtilisateur = statusUtilisateur;
	}

	public Civilite getCivilite() {
		return civilite;
	}

	public void setCivilite(Civilite civilite) {
		this.civilite = civilite;
	}

	public Langue getLangue() {
		return langue;
	}

	public void setLangue(Langue langue) {
		this.langue = langue;
	}

	public List<Commande> getCommandes() {
		return commandes;
	}

	public void setCommandes(List<Commande> commandes) {
		this.commandes = commandes;
	}

	public List<Adresse> getAdresses() {
		return adresses;
	}

	public void setAdresses(List<Adresse> adresses) {
		this.adresses = adresses;
	}

	public void validate() {

		// TODO vérifier la longueur des champs ici

		// TODO vérifier la validité du numéro de téléphone ici
		/**
		 * Librairie de validation des numéros de téléphone : libphonenumber de
		 * Google. https://code.google.com/p/libphonenumber/
		 */

	}

}
